
#Область ОбработчикиСобытийФормы


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	УстановитьУсловноеОформлениеФормы();
	ЗаполнитьТаблицуПараметровСеанса();

	УИ_ОбщегоНазначения.ФормаИнструментаПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка, КоманднаяПанель);

КонецПроцедуры



#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура СтрокаПоискаПриИзменении(Элемент)
	ОбработатьПоиск();
КонецПроцедуры
#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыТаблицаПараметровСеанса

&НаКлиенте
Процедура ТаблицаПараметровСеансаЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ТекДанные = Элементы.ТаблицаПараметровСеанса.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		ВозвраТ;
	КонецЕсли;
	
	ПараметрыОбработчика = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыОбработчикаСобытияНачалоВыбораЗначения(ЭтотОбъект,
																										  Элемент,
																										  "Значение");
	ПараметрыОбработчика.ДоступенКонтейнер = Истина;
	ПараметрыОбработчика.Значение = ТекДанные.Значение;
	ПараметрыОбработчика.СтруктураХраненияЗначения = ТекДанные;
	ПараметрыОбработчика.НаборТипов = УИ_ОбщегоНазначенияКлиентСервер.НаборыТиповДляПараметровСеансов();
	ПараметрыОбработчика.ТекущееОписаниеТиповЗначения = ТекДанные.ТипЗначения;
	
	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("ИдентификаторСтроки", ТекДанные.ПолучитьИдентификатор());
	ПараметрыОбработчика.ОповещениеОЗавершении = Новый ОписаниеОповещения("ТаблицаПараметровСеансаЗначениеНачалоВыбораЗавершениеВыбораЗначения",
		ЭтотОбъект, ПараметрыОповещения);

	УИ_ОбщегоНазначенияКлиент.ПолеФормыОбработчикНачалоВыбораЗначения(ПараметрыОбработчика, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаПараметровСеансаЗначениеОчистка(Элемент, СтандартнаяОбработка)
	ТекДанные = Элементы.ТаблицаПараметровСеанса.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыОбработчика = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыОбработчикаСобытияОчистка(ЭтотОбъект,
																							 Элемент,
																							 "Значение");
	ПараметрыОбработчика.ДоступенКонтейнер = Истина;
	ПараметрыОбработчика.СтруктураХраненияЗначения = ТекДанные;
	ПараметрыОбработчика.НаборТипов = УИ_ОбщегоНазначенияКлиентСервер.НаборыТиповДляПараметровСеансов();
	ПараметрыОбработчика.ТекущееОписаниеТиповЗначения = ТекДанные.ТипЗначения;

	УИ_ОбщегоНазначенияКлиент.ПолеФормыОбработчикОчистка(ПараметрыОбработчика, СтандартнаяОбработка);
КонецПроцедуры



&НаКлиенте
Процедура ТаблицаПараметровСеансаЗначениеПриИзменении(Элемент)
	ТекДанные = Элементы.ТаблицаПараметровСеанса.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ПараметрыОбработчика = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыОбработчикаСобытияПриИзменении(ЭтотОбъект,
																								  Элемент,
																								  "Значение");
	ПараметрыОбработчика.ДоступенКонтейнер = Истина;
	ПараметрыОбработчика.СтруктураХраненияЗначения = ТекДанные;
	ПараметрыОбработчика.ТекущееОписаниеТиповЗначения = ТекДанные.ТипЗначения;

	УИ_ОбщегоНазначенияКлиент.ПолеФормыОбработчикПриИзменении(ПараметрыОбработчика);
	
	ТекДанные.Изменено = Истина;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы


&НаКлиенте
Процедура Перечитать(Команда)
	Если ЕстьИзмененныеСтроки() Тогда
		ПоказатьВопрос(Новый ОписаниеОповещения("ПеречитатьЗаверешение", ЭтотОбъект),
			"Есть изменения. Произвести запись перед чтением?", РежимДиалогаВопрос.ДаНетОтмена);
	Иначе
		ПеречитатьЗаверешение(КодВозвратаДиалога.Нет, Неопределено);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Записать(Команда)
	ЗаписатьНаСервере();
КонецПроцедуры

//@skip-check module-unused-method
&НаКлиенте
Процедура Подключаемый_ВыполнитьОбщуюКомандуИнструментов(Команда) 
	УИ_ОбщегоНазначенияКлиент.Подключаемый_ВыполнитьОбщуюКомандуИнструментов(ЭтотОбъект, Команда);
КонецПроцедуры



#КонецОбласти

#Область СлужебныеПроцедурыИФункции


&НаКлиенте
Процедура ПеречитатьЗаверешение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = КодВозвратаДиалога.Отмена Тогда
		Возврат;
	ИначеЕсли Результат = КодВозвратаДиалога.Да Тогда
		ЗаписатьНаСервере();
	КонецЕсли;

	ЗаполнитьТаблицуПараметровСеанса();
	ОбработатьПоиск();
КонецПроцедуры

&НаКлиенте
Функция ЕстьИзмененныеСтроки()
	ЕстьИзменения = Ложь;
	Для Каждого СтрокаКонстанты Из ТаблицаПараметровСеанса Цикл
		Если СтрокаКонстанты.Изменено Тогда
			ЕстьИзменения = Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Возврат ЕстьИзменения;
КонецФункции

&НаКлиенте
Процедура ТаблицаПараметровСеансаЗначениеНачалоВыбораЗавершениеВыбораЗначения(Результат, ДополнительныеПараметры) Экспорт
	ТекДанные = ТаблицаПараметровСеанса.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтроки);
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ТекДанные.Изменено = Истина;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТаблицуПараметровСеанса()
	УстановитьПривилегированныйРежим(Истина);

	ТаблицаПараметровСеанса.Очистить();
	
	СтруктураХраненияКонтейнера = УИ_ОбщегоНазначенияКлиентСервер.НовыйСтруктураХраненияРеквизитаНаФормеСКонейнером("Значение");
	
	Для Каждого ТекПараметрСеанса Из Метаданные.ПараметрыСеанса Цикл
		НоваяСтрока = ТаблицаПараметровСеанса.Добавить();
		НоваяСтрока.Имя = ТекПараметрСеанса.Имя;
		НоваяСтрока.Синоним = ТекПараметрСеанса.Синоним;
		НоваяСтрока.ТипЗначения = ТекПараметрСеанса.Тип;
		НоваяСтрока.Изменено = Ложь;
		
		Попытка
			ЗначениеПараметраСеанса = ПараметрыСеанса[ТекПараметрСеанса.Имя];
		Исключение
			ЗначениеПараметраСеанса = Неопределено;
		КонецПопытки;
		
		УИ_ОбщегоНазначенияКлиентСервер.УстановитьЗначениеПоляСКонтейнером(НоваяСтрока,
																		   СтруктураХраненияКонтейнера,
																		   ЗначениеПараметраСеанса);
	КонецЦикла;
	
	Модифицированность = Ложь;
КонецПроцедуры

&НаСервере
Процедура ЗаписатьНаСервере()
	СтруктураХраненияКонтейнера = УИ_ОбщегоНазначенияКлиентСервер.НовыйСтруктураХраненияРеквизитаНаФормеСКонейнером("Значение");
	Для Каждого СтрокаТаблицы Из ТаблицаПараметровСеанса Цикл
		Если Не СтрокаТаблицы.Изменено Тогда
			Продолжить;
		КонецЕсли;

		ПараметрыСеанса[СтрокаТаблицы.Имя] = УИ_ОбщегоНазначенияКлиентСервер.ЗначениеПоляСКонтейнеромЗначения(СтрокаТаблицы,
																											  СтруктураХраненияКонтейнера);
		СтрокаТаблицы.Изменено = Ложь;
	КонецЦикла;
	
	Модифицированность = Ложь;
КонецПроцедуры

&НаСервере
Процедура УстановитьУсловноеОформлениеФормы()
	УсловноеОформление.Элементы.Очистить();
	
	//Выделять цветом измененные константы
	НовыйЭлементОформления = УсловноеОформление.Элементы.Добавить();
	НовыйЭлементОформления.Использование = Истина;
	
	УИ_ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(НовыйЭлементОформления.Отбор,
															"ТаблицаПараметровСеанса.Изменено",
															Истина);
	
	НовыйЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.БледноБирюзовый);
	
	ОформляемоеПоле = НовыйЭлементОформления.Поля.Элементы.Добавить();
	ОформляемоеПоле.Использование = Истина;
	ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТаблицаПараметровСеанса");
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьПоиск()
	Поиск=СокрЛП(НРег(СтрокаПоиска));

	Если Не ЗначениеЗаполнено(Поиск) Тогда
		Элементы.ТаблицаПараметровСеанса.ОтборСтрок = Неопределено;
	КонецЕсли;

	ОтборСтрок = Новый Структура;
	ОтборСтрок.Вставить("Найдено", Истина);
	Элементы.ТаблицаПараметровСеанса.ОтборСтрок = Новый ФиксированнаяСтруктура(ОтборСтрок);

	Для Каждого ТекСтрока Из ТаблицаПараметровСеанса Цикл
		ТекСтрока.Найдено=СтрНайти(НРег(ТекСтрока.Имя), Поиск) > 0 Или СтрНайти(НРег(ТекСтрока.Синоним), Поиск) > 0;
	КонецЦикла;

КонецПроцедуры





#КонецОбласти
